iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
自我挑戰組

React 開發者的 TypeScript 探索之旅系列 第 22

【 Day 22 】使用 useContext、useReducer 優化資料管理(一)

  • 分享至 

  • xImage
  •  

本系列文章 GitHub

先前我們為了專注於 TypeScript 的使用方式,因此元件間的資料傳遞都是透過 props 進行。但隨著元件和功能越來越多,是不是開始覺得資料傳遞變得有些複雜了呢?為了避免 Props Drilling 的問題,今天我們要使用 useContextuseReducer 來優化目前的資料管理。


整理共用型別

首先,在 src 資料夾下創建一個 store 資料夾,並在裡面新增 TodoContext.tsx 檔案。在現有的專案中,我們在 App.tsx 中匯出了 TodoItemMessageDetails 型別供其他元件使用,現在我們將這些型別移到 TodoContext,統一在這個檔案中管理。

TodoContext.tsx

請將原本在 App.tsxTodoItemMessageDetails 型別複製過來:

export type TodoItem = {
  id: number
  title: string
  isFinished: boolean
}

export type MessageDetails = {
  visible: boolean
  message: string
  mode: 'error' | 'success'
}

App.tsx

刪除原先在這裡定義的 TodoItemMessageDetails 型別,改為從 TodoContext.tsx 匯入:

import { type MessageDetails, type TodoItem } from './store/TodoContext'

TodoList.tsx

更新型別匯入路徑:

import { type TodoItem } from '../store/TodoContext'

Message.tsx

同樣地,更新型別匯入路徑:

import { type MessageDetails } from '../store/TodoContext'

定義 actions

接下來,我們在 TodoContext.tsx 中定義現有的新增和刪除功能的 action

type ActionType =
  | { type: 'ADD_TODO'; payload: string }
  | { type: 'DELETE_TODO'; payload: number }

第一次看到這種寫法可能會覺得有點混亂。之前我們所提到的 Union 寫法不應該是這樣嗎:

type ActionType = { type: 'ADD_TODO'; payload: string } | { type: 'DELETE_TODO'; payload: number }

其實,這兩種寫法是完全等值的。在第一項內容前加上 | 是為了更好的排版,提升可讀性。像是使用 Prettier 這種程式碼格式化工具時,它也會自動為我們在第一行加上 |


由於 useContextuseReducer 對於大多數 React 初學者來說,可能不像 useState 那麼熟悉,因此我們將優化的部分拆成兩篇。在下一篇文章中,我們將使用這兩個 hook 來優化我們的新增和刪除功能。


上一篇
【 Day 21 】在 TypeScript 中使用 setState 進行狀態管理
下一篇
【 Day 23 】使用 useContext、useReducer 優化資料管理(二)
系列文
React 開發者的 TypeScript 探索之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言